package com.zjl.quartz.第01章_基础的使用;

import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;

import java.util.concurrent.TimeUnit;

public class D_触发器 {
    public static void main(String[] args) {

        // 1.定义jobDetail
        JobDetail job = JobBuilder.newJob(D_Job.class)
                .withIdentity("D_Job", "D_JobGroup")
                .usingJobData("count", 0)           // 通过key-value形式设置参数
                .build();

        CronScheduleBuilder cronScheduleBuilder =
                CronScheduleBuilder
                        .cronSchedule("*/2 * * * * ?")//每 2 秒执行
                        //只有在数据库中保存才会看到效果
                        //作用：所有错过的触发都被忽略，并按照原计划执行任务，也就是错过的就错过了，等待下一次执行时间到了再执行。
                        .withMisfireHandlingInstructionDoNothing()
                        //作用：错过了很多次，但是只会立即执行一次，然后按照原计划执行任务。这个是默认的策略！
                        .withMisfireHandlingInstructionFireAndProceed()
                        //作用：立即执行所有错过的触发，错过了100个，一下子把错过的100个全部执行了，然后按照原计划执行任务。
                        .withMisfireHandlingInstructionIgnoreMisfires()
                ;

        // 2.创建一个 Cron 触发器
        CronTrigger cronTrigger = TriggerBuilder.newTrigger()
                .withIdentity("D_cronTrigger", "D_CronTriggerGroup")
                .startAt(DateBuilder.futureDate(10, DateBuilder.IntervalUnit.SECOND)) // 延迟10秒执行
                .withSchedule(cronScheduleBuilder)//触发策略

                .build();

        try {
            // 3.定义调度器
            Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
            // 设置任务和触发器，由触发器进行分派任务
            scheduler.scheduleJob(job, cronTrigger);
            scheduler.start();

            // 让主线程延迟执行，scheduler如果shutdown，则所有的定时任务会取消。
            TimeUnit.SECONDS.sleep(20);
            scheduler.shutdown();
        } catch (SchedulerException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
